package com.atguigu.gulimall.order;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.config.annotation.web.http.EnableSpringHttpSession;

/**
 * 使用RabbitMq
 * 1.引入场景启动器:spring-boot-starter-amqp。RabbitAutoConfiguration就会自动生效
 * 		所有的属性都在
 * 	    @ConfigurationProperties(prefix = "spring.rabbitmq")
 * 		public class RabbitProperties{}进行绑定的
 * 2.给Properties文件中添加配置spring.rabbitmq.host+port+virtual-host
 * 3.结果就是给容器中自动配置了RabbitTemplate和AmqpAdmin还有连接RabbitMq的连接工厂CachingConnectionFactory以及最后的RabbitMessagingTemplate
 * 4.添加注解@EnableRabbit开启RabbitMq
 * 5.监听消息:使用注解public @interface RabbitListener{}.注意，这个注解必须在主启动类中开启@EnableRabbit才能使用，并且标注此注解的
 * 		方法必须在容器中
 * 6.@RabbitListener(queues = {"hello-java-queue"}) 用来监听指定队列的消息，放在类上
 * 	 @RabbitHandler 修饰方法，用来接收不同类型的消息，自动进行参数绑定
 *
 * 7.seata控制分布式事务
 * 		1）每一个微服务先必须创建undo-log表(回滚日志)
 * 		2）安装事务协调器:就是seata-server( https://github.com/seata/seata/releases)
 * 		3）整合:
 * 			a）导入依赖，直接在gulimall-common里面导入即可:spring-cloud-starter-alibaba-seata
 * 			b）导入依赖后我们会发现里面有一个io.seta:seata-all:1.3.0的依赖。那么我们的事务协调器seata软件就需要是1.3.0的
 * 			c）解压seata软件后进入conf目录下的registry.conf文件更改seata的注册中心是什么以及他的配置信息存储在哪里
 * 		4）开启全局事务	在业务方法前面添加@GlobalTransactional注解，当然同时也得加上本地的@Transactional
 * 		5）所有想用到分布式事务的微服务都需要使用seata 的DataSourceProxy代理自己的数据源，这样seata才能实现事务协调，我们将配置写在了MySeataConfig类当中
 *		6）每个微服务必须导入registry.conf和file.conf放在resources目录下
 *		7）在properties配置文件中，填写spring.cloud.alibaba.seata.tx-service-group=${spring.application.name}-fescar-service-group作为服务名注册到 Seata Server上
 *		8）启动测试分布式事务
 *
 */
@EnableRabbit
@EnableFeignClients
@EnableDiscoveryClient
@EnableSpringHttpSession
@SpringBootApplication
public class GulimallOrderApplication {

	public static void main(String[] args) {
		SpringApplication.run(GulimallOrderApplication.class, args);
	}

}
